package com.testing.sunnyserver.handler;

import com.testing.sunnycommon.automation.model.AutoLog;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Component;

import javax.xml.bind.SchemaOutputResolver;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @Classname MessageHandler
 * @Description 类型说明
 * @Date 2023/7/19 20:15
 * @Created by 特斯汀Roy
 */
@Component
@Slf4j
public class MessageHandler {

    @Autowired
    SimpMessagingTemplate simpMessagingTemplate;

    //通过监听器，监听noticeQueue中的内容，一旦有数据，就直接调用这个方法，把数据作为参数传入。
    @RabbitListener(queues = {"noticeQueue"})
    public void noticeConsumer(String notice) {
        System.out.println("从消息队列中获取到了消息" + notice);
        simpMessagingTemplate.convertAndSend("/topic/notice", notice);
    }

    @RabbitListener(queues = {"logQueue"})
    public void pushLogs(String autoLog) {
        System.out.println("从消息队列中获取到了日志" + autoLog);
        //通过正则表达式，将日志信息取出来转成autoLog对象。注意由于有换行，所以不能用.* 而是用[\\s\\S]*
        //最后一位的分组注意规则：  第一种情况是报错出现换行，取前两行  第二种情况是不换行直接取到第一行行位
        Pattern logPattern = Pattern.compile("^(.*?) \\[(.*?)\\] (.*?) (.*?) \\- ([\\s\\S]*?\\r[\\s\\S]*?|[\\s\\S]*)\\r");
        Matcher matcher = logPattern.matcher(autoLog);
        AutoLog autoLogInstance = new AutoLog();
        if (matcher.find()) {
            System.out.println(matcher.group(0));
            autoLogInstance.setTimestamp(matcher.group(1));
            autoLogInstance.setThreadName(matcher.group(2));
            autoLogInstance.setLevel(matcher.group(3));
            autoLogInstance.setLoggerName(matcher.group(4));
            autoLogInstance.setMessage(matcher.group(5));
        }
        System.out.println("将日志解析为autoLog对象" + autoLogInstance);

        simpMessagingTemplate.convertAndSend("/topic/allLog", autoLogInstance);
    }


}
